// 抽象一个共有的一个棋子的类
// name 名字
// camp 阵营
// position  位置
// inwhichArea :number 分为两个阵营
// canMove 移动的点

import { COL, ROW } from "../config/config";
import { GEBI, getCol, getRow } from "../util/utll";

// 定义一个接口
export interface ChessInterface {
	name: string; //名字
	camp: number; //阵营 0 red 1 black
	position: number; //位置
	inwhichArea: number; //分为两个阵营
	canMove: () => Array<number>; //移动的点
	move(to: number): void
}

// 抽象出一个棋子的大类
export class Chess {
	public inWhichArea: number;
	public name: string = ''
	// 构造函数中实现一个方法 这代表了在构造函数的时候作为我们这个类的属性
	constructor(public position: number, public camp: number) {
		this.inWhichArea = camp
	}
	// 落子方式
	move(to: number): boolean {
		// 传入GEBI
		let point = GEBI(this.position + '');
		// 先保存一下移动之前的位置
		let boginPosition: number;
		let hoveFinish: boolean = false
		// 1.移除棋子旧的位置 (样式)
		// 棋子的文本清空
		point!.innerText = ''
		// 把棋子阵营的样式删除
		point!.classList.remove(`camp${this.camp}`)
		// 保存棋子当前的位置
		boginPosition = this.position

		this.position = to
		point = GEBI(this.position + '')
		// 2.如果吃子需要移除对方棋子的样式
		if (point!.innerText !== '') {
			point!.classList.remove(`camp${this.camp ? 0 : 1}`)
			// 2.1 吃将  游戏结束
			if (point?.innerText === '将') {
				alert(`恭喜${this.camp ? '黑方' : '红方'}获胜`)
				hoveFinish = true
			}
		}


		// 3.增加棋子新的位置 (样式)
		// 添加棋子的文本
		point!.innerText = this.name
		// 添加棋子的样式
		point!.classList.add(`camp${this.camp}`)

		// 4.判断棋子区域是否变化
		this.inWhichArea = this.position <= COL * ROW / 2 ? 0 : 1
		// 返回这个函数
		return hoveFinish

	}
	// 上方可移动的区域
	protected getTopMoviableArea(): Array<number> {
		// 存储我们需要的数据
		let p: Array<number> = []
		// 循环获取我们需要得到的点位
		//1.获取我们目前的点
		// 2.得出向上移动的格子上限在哪 90 所经历的共九行 COL
		for (let i = this.position; i <= 90; i += COL) {
			// 不包括自己的格子
			if (i === this.position) continue;
			// 判断上方是否存在其他的棋子
			if (GEBI(i + '')?.innerText) {
				p.push(i)
				break
			}
			p.push(i)
		}
		return p
	}
	// 下方可移动的区域

	protected getDownMoviableArea(): Array<number> {
		// 存储我们需要的数据
		let p: Array<number> = []
		// 循环获取我们需要得到的点位
		//1.获取我们目前的点
		// 2.得出向上移动的格子下限在哪 0 所经历的共九行 COL
		for (let i = this.position; i >= 0; i -= COL) {
			// 不包括自己的格子
			if (i === this.position) continue;
			// 判断上方是否存在其他的棋子
			if (GEBI(i + '')?.innerText) {
				p.push(i)
				break
			}
			p.push(i)
		}
		return p
	}
	// 左方可移动的区域

	protected getLeftMoviableArea(): Array<number> {
		// 存储我们需要的数据
		let p: Array<number> = []
		// 获取当前的位置的行数 根据行数—1*行长 
		for (let i = this.position; i >= (getRow(this.position) - 1) * COL + 1; i--) {
			// 不包括自己的格子

			if (i === this.position) continue;
			// 判断上方是否存在其他的棋子

			if (GEBI(i + '')?.innerText) {
				p.push(i)
				break
			}
			p.push(i)
		}
		return p
	}
	// 右方可移动的区域

	protected getRigthMoviableArea(): Array<number> {
		// 存储我们需要的数据
		let p: Array<number> = []
		// 获取当前的位置的行数 根据行数*行长 

		for (let i = this.position; i <= (getRow(this.position)) * COL; i++) {
			// 不包括自己的格子

			if (i === this.position) continue;
			// 判断上方是否存在其他的棋子

			if (GEBI(i + '')?.innerText) {
				p.push(i)
				break
			}
			p.push(i)
		}
		return p
	}
	// 判断一个点位是否有棋子
	protected haveChess(position: number) {
		return GEBI(position + '')?.innerText !== ''
	}
}